home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / jazlib.arc / VIEW.DMO < prev    next >
Text File  |  1988-12-18  |  5KB  |  175 lines

  1. /*
  2. ┌────────────────────────────────────────────────────────────────────────────┐
  3. │ Title   : view.c                                 │
  4. │ Purpose : View a file on the screen but on exit, return the users screen   │
  5. │        to what it originally was including the command line which         │
  6. │        invoked this program.                         │
  7. │            USAGE:     View <filename>                 │
  8. │    Written by Jack Zucker - 75766,1336    301-794-5950  on 02-03-1986   │
  9. └────────────────────────────────────────────────────────────────────────────┘
  10. */
  11.  
  12. #include <jaz.h>        /* misc macros */
  13. #include <jzscreen.h>        /* window defs */
  14. #include <gscreen.h>        /* global window constants */
  15. #include <stdio.h>        /* standard io defs */
  16.  
  17. #define max(x,y) (x > y ? x : y)
  18. #define min(x,y) (x < y ? x : y)
  19.  
  20. #define MAXLINES 2000        /* max lines in file */
  21. #define PGUP 73
  22. #define PGDN 81
  23. #define HOME 71
  24. #define END  79
  25. #define DARR 80
  26. #define UARR 72
  27. #define ESC  27
  28. #define ATTRIBUTE 31        /* video attribute for screen */
  29. #define TIMER 0x1C        /* vector for timer interrupt */
  30.  
  31. int WDONE = 0;            /* flag for done with program */
  32. int gcount = 17;        /* tic count for clock routine*/
  33. int clock();            /* interrupt handler for clock*/
  34.  
  35. main(argc,argv)
  36. int argc;
  37. char **argv;
  38. {
  39.   TWINDOW *ptr;         /* pointer to window structure */
  40.   char wbuf[256],wtemp[256],*strchr();
  41.   int num,windex=0,wlinelen,wstart,w,wrow;
  42.   char *pline[MAXLINES],*p;    /* allocate memory for lines */
  43.   FILE *fd;
  44.   char *ch,chr;
  45.   int wch;
  46.   TVECTOR wvec;         /* hold timer interrupt vector address */
  47.  
  48.   jzgetint(TIMER,&wvec);    /* get original timer address */
  49.  
  50.   ptr = jzappend(&g_header,7,0,0,0x18,0x4f,1); /* save original window */
  51.  
  52.   if (argc < 2) {
  53.     printf("\nVIEW... by Jack A. Zucker @794-5950 | 794-8763 | 75766,1336");
  54.     exitpgm(ptr,"USAGE:   View <filename>");
  55.   }
  56.  
  57.   if (! (fd = fopen(argv[1],"r"))) {
  58.     sprintf(wbuf,"Can't open %s",argv[1]);
  59.     exitpgm(ptr,wbuf);
  60.   }
  61.  
  62.   jzloccur(24,0);
  63.   printf("Reading Line# ");
  64.   jzclreol(0x18,0x0e,7);
  65.  
  66.   while ( (ch = fgets(wbuf,255,fd)) ) {    /* read file - display line# */
  67.     tabtosp(wbuf,wtemp);
  68.     wtemp[79] = '\0';
  69.     p = strchr(wtemp,'\n');                      /* get rid of new lines */
  70.     if (p) *p = '\0';                           /* get rid of new line */
  71.     pline[windex] = (char *) malloc(strlen(wtemp)+1);     /* memory for line */
  72.     jzloccur(24,14);
  73.     printf("%04d",windex+1);
  74.     strcpy(pline[windex],wtemp);  /* copy line into list */
  75.     ++windex;
  76.   }
  77.   fclose(fd);
  78.  
  79.   windex--;        /* get last line number */
  80.   wstart = 0;
  81.  
  82.   jzclreol(0x18,0,7);
  83.   jzloccur(24,20);
  84.   printf("ESC | UARR | DARR | HOME | END | PGUP | PGDN");
  85.  
  86.   jzinsint(TIMER,clock);           /* install our interrupt handler */
  87.  
  88.   dispscreen(pline,wstart,windex);
  89.   do {
  90.     jzloccur(24,0);                /* print line # of 1st line */
  91.     printf("Line# %04d",wstart+1);
  92.     if ((chr = jzinkey(&wch)))
  93.       switch (chr) {                /* look for esc key - end */
  94.     case ESC : WDONE = 1;
  95.       }
  96.     else
  97.       switch(wch) {
  98.     case PGUP :
  99.       wstart = max(0,wstart-24);
  100.       dispscreen(pline,wstart,windex);
  101.       break;
  102.     case PGDN :
  103.       wstart = max(min(windex-23,wstart+24),0);
  104.       dispscreen(pline,wstart,windex);
  105.       break;
  106.     case UARR :
  107.       if (wstart) {
  108.         wstart = max(0,wstart-1);
  109.         jzscrldn(0,0x174f,1,ATTRIBUTE);           /* clear screen window */
  110.         jzscrprn(pline[wstart],0,0,ATTRIBUTE);
  111.       }
  112.       break;
  113.     case DARR :
  114.       if (windex - (wstart + 23) > 0) {
  115.         wstart = max(min(windex-23,wstart+1),0);
  116.         jzscrlup(0,0x174f,1,ATTRIBUTE);           /* clear screen window */
  117.         jzscrprn(pline[wstart+23],23,0,ATTRIBUTE);
  118.       }
  119.       break;
  120.     case HOME :
  121.       wstart = 0;
  122.       dispscreen(pline,wstart,windex);
  123.       break;
  124.     case END :
  125.       wstart = max(0,windex-23);
  126.       dispscreen(pline,wstart,windex);
  127.       break;
  128.       }
  129.   } while (! WDONE);
  130.  
  131.   jzsetint(TIMER,wvec);         /* restore original interrupt handler */
  132.  
  133.   jzloccur(ptr->row-2,ptr->col);        /* back to original pos */
  134.   jzrstwnd(ptr);                /* restore users window */
  135.  
  136. }
  137.  
  138. exitpgm(fptr,fmsg)
  139. TWINDOW *fptr;
  140. char *fmsg;
  141. {
  142.    printf("\n%s",fmsg);                         /* print message */
  143.    printf("\nHit <ENTER> to continue...");
  144.    do ; while (getch() != 13);            /* loop 'til <ENTER> */
  145.    jzloccur(fptr->row-2,fptr->col);        /* back to original pos */
  146.    jzrstwnd(fptr);                /* restore users window */
  147.    exit(1);
  148. }
  149.  
  150. dispscreen(fline , fstart , findex)
  151. char **fline;
  152. int fstart,findex;
  153. {
  154.   int wrow,w;
  155.  
  156.   jzscrlup(0,0x174f,0,ATTRIBUTE);         /* clear screen window */
  157.   wrow = 0;
  158.   for(w = fstart; w <= fstart + 23 ; w ++)
  159.     if (w > findex) return;
  160.     else jzscrprn(fline[w],wrow++,0,ATTRIBUTE);       /* bios write str */
  161. }
  162.  
  163. clock()
  164. {
  165.    char wstr[9];
  166.    if (gcount >= 18) {
  167.      jzbiostm(wstr);
  168.      jzscrprn(wstr,24,71,MAGENTA);
  169.      gcount = 0;
  170.    }
  171.    else
  172.      gcount ++;
  173. }
  174.  
  175.